sources <- c("ESPN", "FantasyData", "FantasyPros", "FantasySharks", 
             "FFToday", "NumberFire", "Yahoo", "FantasyFootballNerd", 
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 50000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 1473.75 sec elapsed

Results

sim_lu %>%
  filter(lineup<=3) %>%
  arrange(lineup, position, desc(pts_pred)) %>%
  knitr::kable() %>%
  kable_styling() %>%
  column_spec(1, bold=TRUE) %>%
  collapse_rows(columns = 1, valign = 'top')
lineup Name team position pts_base pts_pred sd_pts Salary
1 Lamar Jackson BAL QB 23.31000 25.721315 1.161469 8900
Ezekiel Elliott DAL RB 19.64250 20.301426 0.644931 9000
Clyde Edwards-Helaire KCC RB 17.70750 17.527625 0.370650 7900
Raheem Mostert SFO RB 11.18975 16.960738 2.957787 6500
Cooper Kupp LAR WR 13.56200 14.997075 1.275036 7200
Curtis Samuel CAR WR 7.71875 12.942234 2.485579 5100
John Hightower PHI WR 6.83500 12.654904 2.750223 4800
George Kittle SFO TE 13.61770 14.367303 0.977156 7100
Carolina Panthers CAR DST 5.47000 6.856311 0.741300 3500
2 Patrick Mahomes KCC QB 25.04200 26.930638 1.148422 9000
Ezekiel Elliott DAL RB 19.64250 19.812373 0.644931 9000
James Robinson JAC RB 15.65500 15.714804 0.155673 6600
Jerick McKinnon SFO RB 14.02150 15.476782 0.963690 6400
Robert Woods LAR WR 13.31675 15.041510 1.401057 6700
Darius Slayton NYG WR 12.90500 13.009215 0.118608 5800
Hunter Renfrow LVR WR 9.45875 11.895392 2.200178 5100
George Kittle SFO TE 13.61770 15.837443 0.977156 7100
Arizona Cardinals ARI DST 6.72500 8.627821 1.037820 4200
3 Patrick Mahomes KCC QB 25.04200 26.042846 1.148422 9000
Kareem Hunt CLE RB 16.40203 16.665144 1.988090 7000
James Robinson JAC RB 15.65500 15.871807 0.155673 6600
Jerick McKinnon SFO RB 14.02150 15.129793 0.963690 6400
Calvin Ridley ATL WR 16.13750 18.581459 2.105292 8300
Darius Slayton NYG WR 12.90500 12.790193 0.118608 5800
Tee Higgins CIN WR 9.28150 12.628529 4.477452 5400
George Kittle SFO TE 13.61770 13.905107 0.977156 7100
Pittsburgh Steelers PIT DST 8.11000 9.830630 1.186080 4400
ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
sim_lu %>%
  group_by(lineup) %>%
  mutate(lineup_pts=sum(pts_pred)) %>%
  group_by(lineup, position) %>%
  mutate(n = n()) %>%
  select(lineup, position, n, lineup_pts) %>%
  distinct() %>%
  spread(key=position, value=n) %>%
  filter(RB >= 2, TE >= 1, WR >= 3) %>%
  mutate(flex = case_when(RB==3 ~ 'RB',
                          TE==2 ~ 'TE',
                          WR==4 ~ 'WR')) %>%
  group_by(flex) %>%
  dplyr::summarize(median_pts = round(median(lineup_pts), 3),
                   cases = n()) %>%
  knitr::kable() %>%
  kable_styling(full_width = FALSE)
flex median_pts cases
RB 141.992 48261
TE 140.331 5
WR 143.815 1734
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd)) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs Uncertainty',
          subtitle = 'Pareto Lineups Bolded')

psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
30204 136.76 4.47 Kyler Murray ARI QB 23.75 0.68 8300
Clyde Edwards-Helaire KCC RB 17.83 0.37 7900
James Conner PIT RB 15.38 0.23 7000
James Robinson JAC RB 15.79 0.16 6600
Amari Cooper DAL WR 15.68 0.40 7800
Tyler Boyd CIN WR 13.26 0.78 6000
Darius Slayton NYG WR 12.90 0.12 5800
George Kittle SFO TE 14.94 0.98 7100
Dallas Cowboys DAL DST 7.25 0.76 3500
30019 136.99 4.89 Patrick Mahomes KCC QB 26.71 1.15 9000
Clyde Edwards-Helaire KCC RB 17.46 0.37 7900
James Conner PIT RB 15.60 0.23 7000
James Robinson JAC RB 15.46 0.16 6600
Tyreek Hill KCC WR 17.04 1.03 8200
Robert Woods LAR WR 15.79 1.40 6700
Darius Slayton NYG WR 13.23 0.12 5800
Evan Engram NYG TE 9.36 0.17 5500
Atlanta Falcons ATL DST 6.35 0.27 3300
30817 137.96 5.26 Patrick Mahomes KCC QB 25.11 1.15 9000
Clyde Edwards-Helaire KCC RB 17.81 0.37 7900
James Conner PIT RB 15.94 0.23 7000
James Robinson JAC RB 15.58 0.16 6600
Terry McLaurin WAS WR 14.44 1.16 6300
CeeDee Lamb DAL WR 13.89 1.06 5900
Darius Slayton NYG WR 13.11 0.12 5800
Travis Kelce KCC TE 15.56 0.75 7800
Atlanta Falcons ATL DST 6.51 0.27 3300
25050 140.78 5.32 Patrick Mahomes KCC QB 26.73 1.15 9000
Clyde Edwards-Helaire KCC RB 17.41 0.37 7900
James Conner PIT RB 15.53 0.23 7000
James Robinson JAC RB 15.74 0.16 6600
Cooper Kupp LAR WR 16.70 1.28 7200
Tyler Boyd CIN WR 13.76 0.78 6000
Darius Slayton NYG WR 12.87 0.12 5800
George Kittle SFO TE 15.96 0.98 7100
Atlanta Falcons ATL DST 6.08 0.27 3300
30022 142.47 6.18 Dak Prescott DAL QB 27.78 1.52 8700
Clyde Edwards-Helaire KCC RB 18.11 0.37 7900
James Robinson JAC RB 15.63 0.16 6600
Jerick McKinnon SFO RB 14.40 0.96 6400
Tyreek Hill KCC WR 18.07 1.03 8200
Tyler Boyd CIN WR 13.70 0.78 6000
Darius Slayton NYG WR 12.94 0.12 5800
George Kittle SFO TE 15.89 0.98 7100
Atlanta Falcons ATL DST 5.95 0.27 3300
39096 142.57 Deshaun Watson HOU QB 27.45 1.72 7900
Clyde Edwards-Helaire KCC RB 18.10 0.37 7900
James Conner PIT RB 15.86 0.23 7000
James Robinson JAC RB 15.74 0.16 6600
Tyreek Hill KCC WR 17.39 1.03 8200
CeeDee Lamb DAL WR 13.05 1.06 5900
Darius Slayton NYG WR 13.19 0.12 5800
George Kittle SFO TE 14.59 0.98 7100
Jacksonville Jaguars JAC DST 7.20 0.52 3600
45145 142.85 6.25 Deshaun Watson HOU QB 27.77 1.72 7900
Ezekiel Elliott DAL RB 20.54 0.64 9000
Clyde Edwards-Helaire KCC RB 17.48 0.37 7900
James Robinson JAC RB 15.63 0.16 6600
Marquise Brown BAL WR 14.97 1.22 6100
Tyler Boyd CIN WR 13.39 0.78 6000
Darius Slayton NYG WR 12.79 0.12 5800
George Kittle SFO TE 14.10 0.98 7100
Atlanta Falcons ATL DST 6.18 0.27 3300
16791 143.32 6.27 Patrick Mahomes KCC QB 26.01 1.15 9000
Clyde Edwards-Helaire KCC RB 17.75 0.37 7900
James Conner PIT RB 15.61 0.23 7000
James Robinson JAC RB 15.71 0.16 6600
Robby Anderson CAR WR 17.98 1.95 6200
Tyler Boyd CIN WR 13.58 0.78 6000
Darius Slayton NYG WR 12.94 0.12 5800
Travis Kelce KCC TE 15.32 0.75 7800
Dallas Cowboys DAL DST 8.42 0.76 3500
38327 143.77 6.63 Deshaun Watson HOU QB 26.21 1.72 7900
Ezekiel Elliott DAL RB 20.47 0.64 9000
Clyde Edwards-Helaire KCC RB 17.46 0.37 7900
James Robinson JAC RB 15.59 0.16 6600
DeVante Parker MIA WR 15.55 1.59 6400
Tyler Boyd CIN WR 13.52 0.78 6000
Darius Slayton NYG WR 12.94 0.12 5800
George Kittle SFO TE 15.81 0.98 7100
Atlanta Falcons ATL DST 6.23 0.27 3300
44373 145.87 6.70 Patrick Mahomes KCC QB 27.13 1.15 9000
Clyde Edwards-Helaire KCC RB 17.77 0.37 7900
James Conner PIT RB 16.30 0.23 7000
James Robinson JAC RB 15.56 0.16 6600
Robby Anderson CAR WR 19.46 1.95 6200
Marquise Brown BAL WR 14.99 1.22 6100
Darius Slayton NYG WR 13.01 0.12 5800
Travis Kelce KCC TE 14.77 0.75 7800
Dallas Cowboys DAL DST 6.89 0.76 3500
17985 145.88 6.93 Patrick Mahomes KCC QB 27.11 1.15 9000
Clyde Edwards-Helaire KCC RB 17.82 0.37 7900
James Conner PIT RB 15.57 0.23 7000
James Robinson JAC RB 15.78 0.16 6600
Robert Woods LAR WR 17.05 1.40 6700
Terry McLaurin WAS WR 15.19 1.16 6300
Marquise Brown BAL WR 15.06 1.22 6100
George Kittle SFO TE 16.02 0.98 7100
Atlanta Falcons ATL DST 6.27 0.27 3300
24928 146.16 7.08 Patrick Mahomes KCC QB 25.88 1.15 9000
Clyde Edwards-Helaire KCC RB 17.28 0.37 7900
James Robinson JAC RB 15.64 0.16 6600
David Johnson HOU RB 16.12 1.16 6400
Amari Cooper DAL WR 15.90 0.40 7800
Darius Slayton NYG WR 12.95 0.12 5800
Diontae Johnson PIT WR 18.69 1.99 5800
George Kittle SFO TE 15.20 0.98 7100
Dallas Cowboys DAL DST 8.50 0.76 3500
29811 146.70 7.52 Patrick Mahomes KCC QB 26.27 1.15 9000
Clyde Edwards-Helaire KCC RB 18.05 0.37 7900
Kareem Hunt CLE RB 22.53 1.99 7000
James Robinson JAC RB 16.02 0.16 6600
Cooper Kupp LAR WR 15.66 1.28 7200
Marquise Brown BAL WR 14.16 1.22 6100
Darius Slayton NYG WR 12.69 0.12 5800
George Kittle SFO TE 15.44 0.98 7100
Atlanta Falcons ATL DST 5.88 0.27 3300
12289 148.33 7.98 Patrick Mahomes KCC QB 27.35 1.15 9000
Ezekiel Elliott DAL RB 20.63 0.64 9000
James Conner PIT RB 15.60 0.23 7000
James Robinson JAC RB 15.74 0.16 6600
Robby Anderson CAR WR 15.85 1.95 6200
Darius Slayton NYG WR 12.95 0.12 5800
Diontae Johnson PIT WR 17.18 1.99 5800
George Kittle SFO TE 16.05 0.98 7100
Dallas Cowboys DAL DST 6.99 0.76 3500
15005 148.46 8.05 Patrick Mahomes KCC QB 25.87 1.15 9000
Clyde Edwards-Helaire KCC RB 18.17 0.37 7900
James Conner PIT RB 15.48 0.23 7000
James Robinson JAC RB 15.86 0.16 6600
Marquise Brown BAL WR 14.75 1.22 6100
Tyler Boyd CIN WR 13.51 0.78 6000
Diontae Johnson PIT WR 18.31 1.99 5800
George Kittle SFO TE 16.12 0.98 7100
Pittsburgh Steelers PIT DST 10.40 1.19 4400
49351 150.00 8.06 Patrick Mahomes KCC QB 26.64 1.15 9000
Clyde Edwards-Helaire KCC RB 18.42 0.37 7900
James Conner PIT RB 15.83 0.23 7000
James Robinson JAC RB 15.42 0.16 6600
Robert Woods LAR WR 16.08 1.40 6700
Robby Anderson CAR WR 18.54 1.95 6200
CeeDee Lamb DAL WR 15.05 1.06 5900
George Kittle SFO TE 15.17 0.98 7100
Dallas Cowboys DAL DST 8.85 0.76 3500
3903 151.40 9.73 Patrick Mahomes KCC QB 26.21 1.15 9000
Ezekiel Elliott DAL RB 20.87 0.64 9000
Kareem Hunt CLE RB 17.71 1.99 7000
James Robinson JAC RB 15.67 0.16 6600
Robby Anderson CAR WR 17.80 1.95 6200
Darius Slayton NYG WR 12.89 0.12 5800
Diontae Johnson PIT WR 16.22 1.99 5800
George Kittle SFO TE 15.70 0.98 7100
Dallas Cowboys DAL DST 8.33 0.76 3500
3197 153.39 10.25 Patrick Mahomes KCC QB 26.62 1.15 9000
Ezekiel Elliott DAL RB 20.66 0.64 9000
James Robinson JAC RB 15.91 0.16 6600
Antonio Gibson WAS RB 16.43 1.56 5800
Amari Cooper DAL WR 15.80 0.40 7800
Darius Slayton NYG WR 12.67 0.12 5800
Tee Higgins CIN WR 24.30 4.48 5400
George Kittle SFO TE 13.44 0.98 7100
Dallas Cowboys DAL DST 7.56 0.76 3500
14295 155.67 11.41 Patrick Mahomes KCC QB 26.08 1.15 9000
Clyde Edwards-Helaire KCC RB 18.12 0.37 7900
Kareem Hunt CLE RB 18.21 1.99 7000
James Robinson JAC RB 15.68 0.16 6600
Marquise Brown BAL WR 14.29 1.22 6100
Darius Slayton NYG WR 12.85 0.12 5800
Tee Higgins CIN WR 23.31 4.48 5400
Travis Kelce KCC TE 15.84 0.75 7800
Pittsburgh Steelers PIT DST 11.30 1.19 4400
40874 157.53 11.71 Patrick Mahomes KCC QB 26.36 1.15 9000
Clyde Edwards-Helaire KCC RB 17.92 0.37 7900
James Conner PIT RB 15.92 0.23 7000
James Robinson JAC RB 15.69 0.16 6600
Robby Anderson CAR WR 15.01 1.95 6200
Marquise Brown BAL WR 15.56 1.22 6100
Tee Higgins CIN WR 24.64 4.48 5400
George Kittle SFO TE 15.82 0.98 7100
Pittsburgh Steelers PIT DST 10.61 1.19 4400
11467 160.56 13.12 Deshaun Watson HOU QB 28.23 1.72 7900
Ezekiel Elliott DAL RB 18.99 0.64 9000
Jonathan Taylor IND RB 17.06 1.47 7100
James Robinson JAC RB 15.96 0.16 6600
Robert Woods LAR WR 14.64 1.40 6700
Diontae Johnson PIT WR 14.46 1.99 5800
Tee Higgins CIN WR 29.25 4.48 5400
Travis Kelce KCC TE 15.26 0.75 7800
Jacksonville Jaguars JAC DST 6.72 0.52 3600
31655 162.18 14.31 Deshaun Watson HOU QB 25.30 1.72 7900
Ezekiel Elliott DAL RB 19.52 0.64 9000
Kareem Hunt CLE RB 20.35 1.99 7000
James Robinson JAC RB 15.80 0.16 6600
Robby Anderson CAR WR 15.53 1.95 6200
Marquise Brown BAL WR 14.11 1.22 6100
Tee Higgins CIN WR 27.11 4.48 5400
George Kittle SFO TE 14.51 0.98 7100
Pittsburgh Steelers PIT DST 9.94 1.19 4400